/*
 * Copyright (c) 2020-2099 the original author or authors. All rights reserve.
 */
package org.tianyun.cloud.config.console.property;

import org.springframework.util.StringUtils;

import java.util.regex.Pattern;

/**
 * 命名空间下组件的路由，用于属性配置的检索
 *
 * @author ebert_chan
 */
public class Route {

    /**
     * 命名空间
     */
    private final String namespace;

    /**
     * 组件
     */
    private final String component;

    /**
     * 正则匹配表达式，用于对属性名称进行匹配识别。当匹配结果为true时，加载对应{{namespace}}下组件为{{component}}的属性源配置；当结果为false时，往下传递从其他属性源获取属性值。
     */
    private final Pattern expression;

    /**
     * 正则匹配结果，默认为分组1
     */
    private final Integer group = 1;

    public Route(String namespace, String component, Pattern expression) {
        this.namespace = namespace;
        this.component = component;
        this.expression = expression;
    }

    public String getNamespace() {
        return namespace;
    }

    public String getComponent() {
        return component;
    }

    public Pattern getExpression() {
        return expression;
    }

    public Integer getGroup() {
        return group;
    }

    /**
     * 根据namespace和自动装备组件的配置前缀创建Route
     *
     * @param namespace 命名空间
     * @param component 组件名称
     * @param prefix    自动装备组件的配置前缀
     * @return org.tianyun.cloud.config.property.Route
     * @author ebert_chan
     */
    public static Route prefix(String namespace, String component, String prefix) {
        if (StringUtils.hasText(prefix)) {
            String regex = "^" + Pattern.quote(prefix) + "\\.?(.+)$";
            return regex(namespace, component, regex);
        }
        return regex(namespace, component, "^(.+)$");
    }

    /**
     * 根据namespace、component和匹配正则表达式创建Route
     *
     * @param namespace 命名空间
     * @param component 组件
     * @param regex     正则表达式
     * @return org.tianyun.cloud.config.env.property.Route
     * @author ebert_chan
     */
    public static Route regex(String namespace, String component, String regex) {
        return new Route(namespace, component, Pattern.compile(regex));
    }

    @Override
    public String toString() {
        return "Route{" + namespace + "," + component + "}";
    }

}
